package com.cy.pj.modules.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

//@Controller
//@ResponseBody
@RestController //等于@Controller + @ResponseBody
public class JsonController {
    /**
     * 当使用@ResponseBody注解描述控制层handleer方法时，假如此方法的返回值
     * 为map或pojo这样对象，系统底层会将这样的转换为json格式字符串，然后响应到客户端
     *
     * 1）在当前应用中这个json格式的字符串会写到http协议的哪一部分中，然后响应到客户端？（响应体）
     * 2）谁将map转换为json格式字符串呢？springboot工程默认使用的是jackson
     */
    @RequestMapping("/doConverMapToJson")
//    @ResponseBody
    public Map<String,Object> doConverMapToJson(){
        Map<String,Object> map = new HashMap<>();
        map.put("state",1);
        map.put("message","ok");
        return  map;
    }
    @RequestMapping("/doPrintJsonToClient")
//    @ResponseBody
    public String doPrintJsonToClient() throws JsonProcessingException {
        Map<String,Object> map = new HashMap<>();
        map.put("state",1);
        map.put("message","ok");
        //将map手动转换为json字符串
        ObjectMapper objectMapper = new ObjectMapper();
        String jsonStr = objectMapper.writeValueAsString(map);
        System.out.println("jsonStr="+jsonStr);
        return  jsonStr;//当使用了@ResponseBody注解时候，返回的就不是view了，就是一个字符串
    }
    @RequestMapping("/doPrintJsonToClient02")
    public void doPrintJsonToClient02(HttpServletResponse response) throws IOException {

        Map<String,Object> map = new HashMap<>();
        map.put("state",0);
        map.put("message","失败");
        //将map手动转换为json字符串
        ObjectMapper objectMapper = new ObjectMapper();
        String jsonStr = objectMapper.writeValueAsString(map);
        System.out.println("jsonStr="+jsonStr);
        response.setCharacterEncoding("utf-8");//设置数据的编码
        response.setContentType("text/jason;charset=utf-8");//告诉客户端响应数据的类型以及编码
        PrintWriter pw = response.getWriter();
        pw.println(jsonStr);
        pw.close();
    }

}
